<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>call和apply</title>
    <script>
        /* 
        根据函数调用方式的不同，this的值不同
            1.以函数的形式调用，this就是window
            2.以方法的形式调用，this就是调用方法的对象
            3.构造函数中，this是新建的对象
            4.箭头函数没有自己的this，箭头函数的this由外层作用域决定。访问的是别人的this。
        
        调用函数除了fn()这种形式之外，还有其它的方式对函数进行调用。
            比如通过使用函数的call()方法和apply()方法来调用这个函数。
                1.call()方法和apply()除了调用函数，还可以指定函数中的this,
                2.call()和apply()中的第一个参数，将会成为就是函数中的this。
                3.fn.call(要指定的this,实参1，实参2....)
                4.fn.apply(要指定的this,[参数1，参数2，.....])通过apply()方法传递实参，实参需要用数组传递

        
        */
       function fn(){
            // console.log(this)   // 这里的this就是window
            console.log('函数执行了')
       }
       fn()

       const obj=new Object()
       obj['fn']=fn;
       obj.fn()     // 以方法的形式调用，这里的this指向调用该方法的对象

       const obj1={
        fn
       }
       obj1.fn()

console.log('===============================================')
      fn.call()     // 实际上就在调用fn这个函数，
      fn.call(obj)  //call()方法和apply()方法的第一个参数就是指定的this

      fn.apply()
      fn.apply(obj1)
console.log('===============================================')

       function fn2(a,b){
        console.log('a=',a,'b=',b,this)
       }

       fn2(11,22)   // 直接调用  
       fn2.call(obj,1,'true')
       fn2.apply(obj,[1,2])
    </script>
</head>
<body>
    
</body>
</html>